# 2024.06.18——比特Python自学笔记
#动态类型、注释、输入与输出、操作符
# 在程序运行的过程中类型可能会发生改变
a = 10
print(type(a))
a = 'a'
print(type(a))
a = 1.0
print(type(a))
# 在程序运行过程中，变量a的类型随着程序的类型，发生了改变

# 静态类型
# 程序运行的过程中，变量的类型始终不变
# 在C++/JAVA中定义的变量的数据类型是不会发生改变的
# 如：int a = 10;在这个代码中，此时的变量a就是一个静态类型
# a的数据类型不会随着程序的运行而发生改变

# 一个编程语言是否是动态类型只取决于运行时，数据类型是否发生改变
# 不取决与变量定义的时候是否声明类型
# Python作为一个动态类型的语言，在定义变量的时候也是可以写类型的，如下所示：
a:int = 10
print(type(a))
a:str = 'a'
print(type(a))
a:bool = True
print(type(a))
a:float = 1.0
print(type(a))
# 动态类型的写法比较灵活——提高了语言的表达能力~
# 一段代码可以处理多种类型的问题
# 然而在编程中‘灵活’这个词往往是贬义，因为‘灵活‘更容易出错
# 相比之下，静态类型的语言还是更好一些~
# 尤其是在大型的程序中，多人协作开发
# 因此很多公司在创业之初，喜欢使用Python来开发
# 这时的产品规模小，仅需要1~2个程序猿就能将产品研发出来
# 但是当项目达到一定的规模之后，动态类型的劣势就体现了出来
# 因此很多公司就会针对之前Python开发的产品用其它语言进行重构

# 注释
# 注释是一种特殊的代码，它不会影响到程序的运行，但是能够起到解释说明的作用
# 能够帮助程序员理解程序代码的执行逻辑
# PS：写代码是一件比较烧脑的事情，读代码同样也是非常的烧脑，相比一板一眼的代码，一些口语化的描述能更好的帮助程序员理解程序
# 行注释——以#开头
# 行注释一般写在要注释的代码的上方，也有少数情况写在要注释代码的右侧，很少写在代码下方，没有写在代码左侧的情况
# 文档字符串
# 使用三引号引起来的称为“文档字符串”
"""
文档字符串起到的作用和注释一样，也是解释说明的效果
与行注释不同的是，文档字符串可以被Python识别
在文档字符串所写的注释中可以包含多行内容
该类注释一般放在文件/函数/类的开头
使用单三引号或者双三引号都是可以的
"""
'''
单三引号与双三引号等价
'''
# 如何写出比较好的注释
# 1. 注释内容必须是准确的！（错误的注释内容会起到误导作用）
# 公司中的项目要经常的进行“迭代“，这样就会导致有些代码和注释本身能够对的上，但是在代码更新后，注释未同步更新，此时就会出现注释与代码对不上的情况
# 因此，但凡要修改代码，务必要记住同步更新注释！！！
# 2. 注释篇幅要合理，既不要太精简，也不要长篇大论~
# 3. 注释的语言与所处环境要对的上，如在中国的公司中最好使用中文注释，在国外的公司中最好使用英文注释
# 当然，如果本身英语水平欠佳，可以直接通过母语写注释
# 4. 注释的内容要积极向上，不要有负能量~

# 批量注释代码：
# 1.选择要注释的代码
# 2.Ctrl + /

# 输入与输出
# 用户把信息传递给程序的过程，称为输入
# 程序把结果展示给用户的过程，称为输出
# 输入输出的最基本的方式就是使用控制台进行输入和输出

# 控制台——对于机械的操作面板就被称为控制台。控制台上会有一些按钮、开关、操纵杆……
# 在计算机中，控制台的概念被延续下来
# 在计算机中，通过鼠标与键盘等输入设备进行输入操作，把操作结果显示到屏幕上
# 计算机中能够将用户输入的命令传达给计算机，再通过计算机将结果显示在屏幕上的程序，就被称为计算机中的控制台……
# 控制台是一种人与计算机交互的最基础的方式，但是在日常生活中却不常用
# 在日常生活中常见的交互方式为图形化界面（GUI）~
# 图形化界面的程序编写起来并不容易~~

# Python中基于控制台的输出
# 通过print()函数来实行单项打印
# 混合打印
print(f"a = { a }")
# 上述这种打印方式称为格式化字符串，这里的f表示的是"format"
# 此时就可以用{}来嵌入变量或者表达式
# 像格式化字符串~很多编程语言都进行了各自的探索
# 如C语言中通过printf以及%d/%c/%p……等占位符来进行格式化打印
# C++中采用std::cout以及<<操作符来实现格式化打印
# JAVA中采用的是字符串拼接，允许字符串与其它数据类型的值进行拼接来实现格式化打印
# Python最早支持格式化打印时是效仿的C语言通过printf来实现
# 但是printf实现时会存在一个问题，当我们在打印的过程中使用了错误的占位符，就容易导致结果出现错误
# 因此在Python 3.6版本中对此进行了改进，开始支持f-string的格式化打印方式

# Python中基于控制台的输入
# 通过内置函数input()来实现输入
num = input('请输入一个整数：')
print(f"您输入的数字为：{num}")
# input在执行时就会开始等待用户的输入
# input输入的内容为字符串
print(type(num))
# 如果只是单纯的拿到用户的输入，可以直接通过print进行打印
# 如果需要将输入的内容进行运算，则需要强制转换输入内容的数据类型
a = input("请输入a的值：")
b = input("请输入b的值：")
print(f"a + b = {a + b}")
# 此时程序执行的是字符串拼接
# 通过int()将其强制转换成整型
a = int(a)
b = int(b)
print(f"a + b = {a + b}")

# 运算符
# 算术运算符——+、-、*、/、%、**、//
# 先算乘方**、，然后乘除、最后加减
# 在Python中，0，不能作为除数
# 运行时出现的错误也叫做“抛出异常”
# 当0作为除数时，会出现除零异常
# 如果程序运行的过程中遇到了“抛出异常”，程序就终止了~异常后面的代码就不会执行~
# 在有些编程语言中：除以整数0会出现"抛出异常"，除以浮点数0则会得到一个无穷大
# 而Python认为无论是整数0还是浮点数0都视为除0，都会产生“抛出异常”
# 除了Python、JavaScrinp等少数编程语言外，大部分的编程语言整数/整数执行的都是整数除法
# %——取余操作符
# **——乘方操作符
# 既支持整数次方运算，也支持小数次方运算（开方运算）
# //——地板除法——取整除法
# 会根据计算的结果进行向下取整
print(7 // 2)
print(-7 // 2)
# 与C/C++不同的是此时的取整是执行向下取整，即-7 // 2的结果在C/C++中为-3，而在Python中为-4

# 关系运算符——<、<= 、> 、>= 、== 、!=
# 比较两个操作数之间的大小关系
# 1.关系运算符对应的表达式的值为布尔型
#   - 表达式成立，表达式结果为真
#   - 表达式不成立，表达式结果为假
print(10 < 20)
print(10 > 20)
print(10 <= 20)
print(10 >= 20)
print(10 == 20)
print(10 != 20)
#  2.关系运算不仅仅能够比较数字，还能够比较字符串
# 在C/C++中，关系操作符仅能够比较数字，比较字符串则需要通过字符串比较函数来进行比较
# 在Python中，关系操作符能够实现字符串之间的比较，比较的方式与C/C++中的字符串比较函数的比较方式相同
# 字符串的比较通过字符的字母表顺序进行比较，如a < b
# 针对中文进行字符串大小比较是无意义的
# Python不支持中文的比较，需要使用第三方库来进行比较
# C/C++ 通过strcmp来比较两个字符串，当直接通过==来比较字符串时，实际上比较的是两个字符串首元素的地址
# JAVA中通过equals来比较两个字符串，当直接通过==来比较字符串时，实际上是在比较两个字符串是否是同一个对象
# 因此C/C++/JAVA这种属于一个小众的行为，像Python这种可以直接使用==和!=来比较字符串内容是否相同的方式则是大部分编程语言所遵守的规则
a = 'a'
b = 'b'
print(a > b)
print(a < b)
print(a >= b)
print(a <= b)
print(a == b)
print(a != b)
# 3.针对浮点数来说，使用==来比较相等存在一定的风险
print(0.1 + 0.2 == 0.3)
print(0.1)
print(0.2)
print(0.3)
print(0.1 + 0.2)
# 由于浮点数在内存中的存储和表示可能存在误差，当我们将两个浮点数通过==来进行比较时，这样的误差会被放大，从而导致==的结果出现错误
a = 0.1 + 0.2
b = 0.3
print(-0.000001 < (a - b) < 0.000001)
# 在Python中是支持这种连续比较的表达方式的
# 在C/C++/JAVA中是不支持这种连续比较的方式的

# 逻辑运算符——and、or、not
# and——并且 <==> &&
# or——或者 <==> ||
# not——逻辑取反 <==> !
a = True and True
print(a)
a = True or False
print(a)
a = not True
print(a)
# 逻辑运算符中的重要细节——短路求值
# 对于and来说，当左侧为False时，右侧则无需求值
# 对于or来说，当左侧为True时，右侧则无需求值
# 短路求值这种行为，大部分编程语言都有

# 赋值运算符——=
# 链式赋值—— a = b = 10
# 在实际开发中尽量不要使用链式赋值，尽量一行代码就只包含一个操作
# 多元赋值——a, b = 10, 20
# 将10赋值给a,将20赋值给b
# 使用多元赋值可以直接完成交换元素
a, b = 10, 20
print(a, b)
a, b = b, a
print(a, b)

# 复合赋值运算——+=、 -=、 *=、 /=、 %=、 **=、//=
a += b
print(a)
a -= b
print(a)
a *= b
print(a)
a /= b
print(a)
a %= 3
print(a)
a **= b
print(a)
a //= b
print(a)

# 在Python中没有位运算的复合运算符
# a &= 1
# print(a)
# a |= 1
# print(a)
# a ^= 1
# print(a)
# a <<= 1
# print(a)
# a >>= 1
# print(a)

# Python不支持自增、自减操作

#移位操作符——<<、 >>
print(1 << 1)
print(8 >> 1)

# Go语言——Golang作者为C语言之父，肯汤姆逊~
# Go语言为C的升级版本
# 在Golang中废除了前置++，只保留了后置++，而且后置++不能取表达式的返回值~~

# 在Python中还存在身份运算符（is、is not）、成员运算符（in、not in）、位运算符（&、|、 ^、 ~、 <<、 >>）等
# ~——按位取反运算符
a = 10
a = ~a
print(a)
